﻿package payments;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileLock;

public class Payments 
{

	/**
	 * @param args
	 * @throws IOException 
	 */
	private static INIFile prop;	//файл настроек
    private static File LOCK_DIR; // директория, в которой находится lock-файл
	private static final String LOCK_FILE_NAME = "payments.lock"; // имя lock-файла
	
    public static void main(String[] args) throws Throwable 
    {
    	//файл настроек в переменную
        try {
			prop = new INIFile(".\\options\\properties.ini");
		} 
        	catch (IOException e3) {e3.printStackTrace();}
        
        
        
        LOCK_DIR = new File (prop.getProperty("path","lockdir","" ));
        if (!new File(LOCK_DIR.toString()).exists()){
    		new File(LOCK_DIR.toString()).mkdir();
    	}
        
        
        
        // проверка на присутсвие единственного выполняемого экземпляра приложения;
        // естественно должна выполняться перед основной инициализацией приложения
        // и реализацией его бизнесс-логики
        singleAppInstanceCheck();
        
        // основная инициализация приложения
        PaymentsPanel mainFrame = new PaymentsPanel();
        //SpreadSheet mainFrame = new SpreadSheet();
        
        // реализация основной функциональности приложения
        mainFrame.setVisible(true);
    }

   

   
    private static void singleAppInstanceCheck() throws Throwable 
    {
        // проверка: запущен ли другой экземпляр приложения?
        if (!lock()) { // если да, то...
            // ... информируем об этом пользователя...
        	System.err.println(
        			"Программа уже запущена!" + System.getProperty("line.separator") +
        			"    1.Открой: Пуск -> Программы -> (Диспетчер задач)" + System.getProperty("line.separator") +
        			"    2.Щелки два раза на (Реестр Платежей)");
        			
            //System.err.println("Приложение уже запущено!");
            // ... и прекращаем работу
            System.exit(1);
        }
    }

    private static boolean lock() 
    {
        try 
        {
            // создаем блокировку
            final FileLock lock = new FileOutputStream(new File(LOCK_DIR, LOCK_FILE_NAME)).getChannel().tryLock();
            if (lock != null)
            {
                //:
                // создаем поток...
                
            	Thread t = new Thread(new Runnable()
                {
                    public void run() 
                    {
                        while (true) 
                        {
                            try 
                            {
                                // ... и проверяем валидность блокировки
                                //     внутри него...
                                if (lock.isValid()) {};
                                // ... а затем засыпаем "навечно"
                                Thread.sleep(Long.MAX_VALUE);
                            }
                            catch (InterruptedException e) 
                            {
                                // игнорируем
                            }
                        }
                    }
                });
                // запускаем поток как "демон",
                // чтобы не блокировать завершение выполнения основной части кода
                
            	t.setDaemon(true);
                t.start();
            }
            return lock != null;
        } catch (Exception ex) 
        {
            // игнорируем, если мы ничего не в силах поделать -
        	// чтобы не запускать на выполнение более одного экземпляра приложения
        	
        	System.err.println(
        			"Неизвестная ошибка!" + System.getProperty("line.separator") +
        			"Возможно программа уже запущена!" + System.getProperty("line.separator") +
                	"    1.Открой: Пуск -> Программы -> (Диспетчер задач)" + System.getProperty("line.separator") +
                	"    2.Щелки два раза на (Реестр Платежей)" + System.getProperty("line.separator") + 
                	System.getProperty("line.separator") +
        			"    Приложение запустить не удалось!");
        	System.exit(1);
            
        }
        return true;
    }
}